/**
 * 数组列表
 *
 * @author jacob
 * @date 2025/6/6 14:52
 */

#include "ArrayList.h"

/*
 * 数组列表初始化
 *
 * @return 数组列表指针.NULL-数组列表初始化失败
 */
ArrayList* initArrayList(void) {
	ArrayList* list = (ArrayList*)malloc(sizeof(ArrayList));
	if (!list) {
        fprintf(stderr, "数组列表初始化错误!数组列表分配内存失败.\n");
		return NULL;
	}
	list->data = (Node*)malloc(ARRAY_LIST_INIT_CAPACITY * sizeof(Node));
	list->length = 0;
	list->capacity = ARRAY_LIST_INIT_CAPACITY;
	return list;
}

/*
 * 数组列表销毁
 *
 * @param list 数组列表指针
 * @return true-数组列表销毁成功;false-数组列表销毁失败
 */
bool destroyArrayList(ArrayList* list) {
    if (list == NULL) {
        fprintf(stderr, "数组列表销毁错误!数组列表为NULL.\n");
        return false;
    }
	free(list->data);
	free(list);
    return true;
}

/*
 * 数组列表长度
 *
 * @param list 数组列表指针
 * @return 数组列表长度
 */
int sizeArrayList(ArrayList* list) {
    if (list == NULL) {
        return 0;
    }
    return list->length;
}

/*
 * 数组列表容量
 *
 * @param list 数组列表指针
 * @return 数组列表容量
 */
int capacityArrayList(ArrayList* list) {
    if (list == NULL) {
        return 0;
    }
    return list->capacity;
}

/*
 * 数组列表是否为空
 *
 * @param list 数组列表指针
 * @return true-数组列表为空;false-数组列表不为空
 */
bool isEmptyArrayList(ArrayList* list) {
    if (list == NULL) {
        return true;
    }
    if (list->length == 0) {
        return true;
    }
    return false;
}

/*
 * 数组列表插入节点
 *
 * @param list  数组列表指针
 * @param index 索引位置
 * @param Node  节点指针
 * @return true-插入节点到数组列表成功;false-插入节点到数组列表失败
 */
bool insertArrayList(ArrayList* list, int index, Node* value) {
    if (list == NULL) {
        fprintf(stderr, "数组列表插入节点错误!数组列表为NULL.\n");
        return false;
    }
    if (index < 0 || index > list->length) {
        fprintf(stderr, "数组列表插入节点错误!索引位置错误.索引:%d\n", index);
        return false;
    }
    if (list->length >= list->capacity) {
        //插入自动扩容，扩容比例1.5，即容量增加50%，Java中ArrayList自动扩容比例也为1.5
        int new_capacity = list->capacity * 3 / 2;
        list->data = (Node*)realloc(list->data, new_capacity * sizeof(Node));
        if (!list->data) {
            fprintf(stderr, "数组列表插入节点错误!列表扩容分配内存失败.新容量:%d\n",new_capacity);
            return false; // 内存不足
        }
        list->capacity = new_capacity;
    }
    for (int i = list->length - 1; i >= index; --i) {
        list->data[i + 1] = list->data[i];
    }
    list->data[index] = *value;
    list->length++;
    return true;
}

/*
 * 数组列表删除节点
 *
 * @param list 数组列表指针
 * @param index 索引位置
 * @return true-数组列表删除节点成功;false-数组列表删除节点失败
 */
bool removeArrayList(ArrayList* list, int index) {
    if (list == NULL) {
        fprintf(stderr, "数组列表删除节点错误!数组列表为NULL.\n");
        return false;
    }
    if (index < 0 || index >= list->length) {
        fprintf(stderr, "数组列表删除节点错误!索引位置错误.索引:%d\n", index);
        return false;
    }
    for (int i = index; i < list->length - 1; ++i) {
        list->data[i] = list->data[i + 1];
    }
    list->length--;
    return true;
}

/*
 * 数组列表获取节点
 *
 * @param list 数组列表指针
 * @param index 索引位置
 * @return Node*-节点指针
 */
Node* getArrayList(ArrayList* list, int index) {
    if (list == NULL) {
        fprintf(stderr, "数组列表获取节点错误!数组列表为NULL.\n");
        return NULL;
    }
    if (index < 0 || index >= list->length) {
        fprintf(stderr, "数组列表获取节点错误!索引位置错误.索引:%d\n", index);
        return NULL;
    }
    return &list->data[index];
}

/*
 * 数组列表设置节点
 *
 * @param list 数组列表指针
 * @param index 索引位置
 * @return true-数组列表设置节点成功;false-数组列表设置节点失败
 */
bool setArrayList(ArrayList* list, int index, Node* value) {
    if (list == NULL) {
        fprintf(stderr, "数组列表设置节点错误!数组列表为NULL.\n");
        return false;
    }
    if (index < 0 || index >= list->length) {
        fprintf(stderr, "数组列表设置节点错误!索引位置错误.索引:%d\n", index);
        return false;
    }
    list->data[index] = *value;
    return true;
}
